home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 7 / Apprentice-Release7.iso / Source Code / Pascal / Snippets / PNL Libraries / OOTextEdit.p < prev    next >
Text File  |  1996-06-01  |  5KB  |  187 lines

  1. unit OOTextEdit;
  2.  
  3. interface
  4.  
  5.     uses
  6.         OOStaticEdit;
  7.  
  8.     type
  9.         TEEditObject = object(TEStaticObject)
  10.                 undotext: Handle;
  11.                 undostart, undoend, undoselstart, undoselend: integer;
  12.                 undoopen: boolean;
  13.                 modified: boolean;
  14.                 procedure Create (dlg: DialogPtr; item, width: integer; vscroll, hscroll, hasgrowb, drawgrowb: boolean);
  15.                 override;
  16.                 procedure Destroy;
  17.                 override;
  18.                 function EditMenuEnabled: boolean;
  19.                 override;
  20.                 procedure SetEditMenuItem (item: integer);
  21.                 override;
  22.                 procedure DoItemWhere (er: EventRecord; item: integer);
  23.                 override;
  24.                 procedure DoEditMenu (item: integer);
  25.                 override;
  26.                 procedure DoKey (modifiers: integer; ch: char);
  27.                 override;
  28.             end;
  29.  
  30. implementation
  31.  
  32.     uses
  33.         BaseGlobals, MyTypes, MyUtils;
  34.  
  35.     function DirtyKey (ch: char): boolean;
  36.     begin
  37.         case ord(ch) of
  38.             homeChar, endChar, helpChar, pageUpChar, pageDownChar, leftArrowChar, rightArrowChar, upArrowChar, downArrowChar: 
  39.                 DirtyKey := false;
  40.             otherwise
  41.                 DirtyKey := true;
  42.         end;
  43.     end;
  44.  
  45.     procedure TEEditObject.Create (dlg: DialogPtr; item, width: integer; vscroll, hscroll, hasgrowb, drawgrowb: boolean);
  46.     begin
  47.         inherited Create(dlg, item, width, vscroll, hscroll, hasgrowb, drawgrowb);
  48.         undotext := NewHandle(0);
  49.         undostart := -1;
  50.         undoopen := false;
  51.         modified := false;
  52.     end;
  53.  
  54.     procedure TEEditObject.Destroy;
  55.     begin
  56.         DisposHandle(undotext);
  57.         inherited Destroy;
  58.     end;
  59.  
  60.     function TEEditObject.EditMenuEnabled: boolean;
  61.         var
  62.             offset: longint;
  63.     begin
  64.         EditMenuEnabled := (undostart >= 0) or (te^^.selStart < te^^.selEnd) or (GetScrap(nil, 'TEXT', offset) > 0) or (te^^.teLength > 0);
  65.     end;
  66.  
  67.     procedure TEEditObject.SetEditMenuItem (item: integer);
  68.         var
  69.             offset: longint;
  70.     begin
  71.         case item of
  72.             EMundo: 
  73.                 SetIDItemEnable(M_Edit, item, undostart >= 0);
  74.             EMcut, EMclear, EMcopy: 
  75.                 SetIDItemEnable(M_Edit, item, te^^.selStart < te^^.selEnd);  { Can cut,copy,clear iff there is a selection }
  76.             EMpaste: 
  77.                 SetIDItemEnable(M_Edit, item, GetScrap(nil, 'TEXT', offset) > 0);        {Paste is enabled for app. windows}
  78.             EMselectall: 
  79.                 SetIDItemEnable(M_Edit, item, te^^.teLength > 0);  { Can select all iff there is something to select }
  80.             otherwise
  81.         end;
  82.     end;
  83.  
  84.     procedure CopyUndoSelection (h: Handle; te: TEHandle);
  85.     begin
  86.         SetHandleSize(h, te^^.selEnd - te^^.selStart);
  87.         BlockMove(Ptr(longint(te^^.hText^) + te^^.selStart), h^, te^^.selEnd - te^^.selStart);
  88.     end;
  89.  
  90.     procedure TEEditObject.DoEditMenu (item: integer);
  91.         var
  92.             oe: OSErr;
  93.             loe: longint;
  94.             th: Handle;
  95.             uss, use: integer;
  96.     begin
  97.         undoopen := false;
  98.         case item of
  99.             EMcopy, EMselectall: 
  100.                 inherited DoEditMenu(item);
  101.             EMcut:  begin
  102.                 CopyUndoSelection(undotext, te);
  103.                 undoselstart := te^^.selStart;
  104.                 undoselend := te^^.selEnd;
  105.                 undostart := te^^.selStart;
  106.                 undoend := undostart;
  107.                 TECut(te);
  108.                 loe := ZeroScrap;
  109.                 oe := TEToScrap;
  110.                 modified := true;
  111.             end;
  112.             EMclear:  begin
  113.                 CopyUndoSelection(undotext, te);
  114.                 undoselstart := te^^.selStart;
  115.                 undoselend := te^^.selEnd;
  116.                 undostart := te^^.selStart;
  117.                 undoend := undostart;
  118.                 TEDelete(te);
  119.                 modified := true;
  120.             end;
  121.             EMpaste:  begin
  122.                 oe := TEFromScrap;
  123.                 if TEGetScrapLen + (te^^.teLength - (te^^.selEnd - te^^.selStart)) > 32000 then
  124.                     AlertUser(paste_to_big)
  125.                 else begin
  126.                     CopyUndoSelection(undotext, te);
  127.                     undoselstart := te^^.selStart;
  128.                     undoselend := te^^.selEnd;
  129.                     undostart := te^^.selStart;
  130.                     TEPaste(te);
  131.                     undoend := te^^.selEnd;
  132.                     modified := true;
  133.                 end;
  134.             end;
  135.             EMundo:  begin
  136.                 uss := undoselstart;
  137.                 use := undoselend;
  138.                 undoselstart := te^^.selStart;
  139.                 undoselend := te^^.selEnd;
  140.                 th := NewHandle(undoend - undostart);
  141.                 BlockMove(Ptr(longint(te^^.hText^) + undostart), th^, undoend - undostart); { save undo for redo }
  142.                 TESetSelect(undostart, undoend, te);
  143.                 TEDelete(te);
  144.                 HLock(undotext);
  145.                 TEInsert(undotext^, GetHandleSize(undotext), te);
  146.                 DisposHandle(undotext);
  147.                 undotext := th;
  148.                 undoend := te^^.selEnd;
  149.                 TESetSelect(uss, use, te);
  150.             end;
  151.             otherwise
  152.         end;
  153.     end;
  154.  
  155.     procedure TEEditObject.DoKey (modifiers: integer; ch: char);
  156.         var
  157.             dk: boolean;
  158.     begin
  159.         dk := DirtyKey(ch);
  160.         if dk then begin
  161.             modified := true;
  162.             if not undoopen then begin
  163.                 CopyUndoSelection(undotext, te);
  164.                 undoselstart := te^^.selStart;
  165.                 undoselend := te^^.selEnd;
  166.                 undostart := te^^.selStart;
  167.             end;
  168.             inherited DoKey(modifiers, ch);
  169.             undoend := te^^.selEnd;
  170.         end
  171.         else
  172.             inherited DoKey(modifiers, ch);
  173.         undoopen := dk;
  174.     end;
  175.  
  176.     procedure TEEditObject.DoItemWhere (er: EventRecord; item: integer);
  177.         var
  178.             uss, use: integer;
  179.     begin
  180.         uss := te^^.selStart;
  181.         use := te^^.selEnd;
  182.         inherited DoItemWhere(er, item);
  183.         if (uss <> te^^.selStart) or (use <> te^^.selEnd) then
  184.             undoopen := false;
  185.     end;
  186.  
  187. end.